package com.youwhen.dao;

import java.sql.Connection;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 
 *
 * @author <a href="mailto:eya@eya.cc">王云权</a>
 * @history
 * <TABLE id="HistoryTable" border="1">
 * 	<TR><TD>时间</TD><TD>描述</TD><TD>作者</TD></TR>
 *	<TR><TD>2011-2-28</TD><TD>创建初始版本</TD><TD>王云权</TD></TR>
 * </TABLE>
 */
@SuppressWarnings("rawtypes")
public interface  Dao {
 
 
	
	/**
	 * 根据sql语句，返回对象集合
	 * @param sql语句(参数用冒号加参数名，例如select * from tb where id=:id)
	 * @param mapParameters参数集合(key为参数名，value为参数值)
	 * @return bean对象集合
	 */
	public List findListBeanByMap(final String sql,Map mapParameters);
	
	
	/**
	 * 根据sql语句，返回对象集合
	 * @param sql语句(参数用冒号加参数名，例如select * from tb where id=:id)
	 * @param beanParameters参数集合,对象包含条件
	 * @return bean对象集合
	 */
	public List findListBeanByBean(final String sql,Object beanParameters);
	
	/**
	 * 根据sql语句，返回对象集合
	 * @param sql语句(参数用冒号加参数名，例如select * from tb where id=?)
	 * @param arrayParameters参数集合,可以用逗号分隔。
	 * @return bean对象集合
	 */
	public List findListBeanByArray(final String sql, Object... arrayParameters);
	
	/**
	 * 根据sql语句，返回对象
	 * @param sql语句(参数用冒号加参数名，例如select * from tb where id=:id)
	 * @param clazz类型
	 * @param mapParameters参数集合(key为参数名，value为参数值)
	 * @return bean对象
	 */
	public Object findUniqueBeanByMap(final String sql,Map mapParameters);
	
	/**
	 * 根据sql语句，返回对象
	 * @param sql语句(参数用冒号加参数名，例如select * from tb where id=?)
	 * @param clazz类型
	 * @param arrayParameters参数集合,可用逗号分隔。
	 * @return bean对象
	 */
	public Object findUniqueBeanByArray(final String sql,Object... arrayParameters);
 
 
	
	/**
	 * 根据sql语句，返回Map对象集合
	 * @see findForMap
	 * @param sql语句(参数用冒号加参数名，例如select count(*) from tb where id=:id)
	 * @param mapParameters参数集合(key为参数名，value为参数值)
	 * @return bean对象
	 */
	public List<Map<String,Object>> findListMapByMap(final String sql,Map mapParameters);

	/**
	 * 根据sql语句，返回Map对象集合
	 * @see findForMap
	 * @param sql语句(参数用冒号加参数名，例如select count(*) from tb where id=?)
	 * @param arraryParameters参数集合
	 * @return bean对象
	 */
	public List<Map<String,Object>> findListMapByArray(final String sql,Object... arraryParameters);
	
	/**
	 * 执行insert，update，delete等操作<br>
	 * 例如insert into users (name,login_name,password) values(:name,:loginName,:password)<br>
	 * 参数用冒号,参数为bean的属性名
	 * @param sql
	 * @param beanParameters
	 * @throws Exception 
	 */
	public int executeBean(final String sql,Object beanParameters) throws Exception;

	/**
	 * 执行insert，update，delete等操作<br>
	 * 例如insert into users (name,login_name,password) values(:name,:login_name,:password)<br>
	 * 参数用冒号,参数为Map的key名
	 * @param sql
	 * @param mapParameters
	 * @throws Exception 
	 */
	public int executeMap(final String sql,Map mapParameters) throws Exception;
	
	/**
	 * 执行insert，update，delete等操作<br>
	 * 例如insert into users (name,login_name,password) values(?,?,?)<br>
	 * 参数用问号,参数为数组集合等
	 * @param sql
	 * @param parameters
	 * @throws Exception 
	 */
	public int executeArray(final String sql,Object... arrayParameters) throws Exception;
	
	/**
	 * 批量执行insert，update，delete等操作<br>
	 * 例如insert into users (name,login_name,password) values(:name,:loginName,:password)<br>
	 * 参数用冒号,参数为bean的属性名
	 * @param sql
	 * @param beanParameters bean数据集合
	 * @throws Exception 
	 */
	public int[] executeBatchByCollectionBeans(final String sql,Collection<Object> beanParameters)throws Exception;
	
	/**
	 * 批量执行insert，update，delete等操作<br>
	 * 例如insert into users (name,login_name,password) values(:name,:loginName,:password)<br>
	 * 参数用冒号,参数为bean的属性名
	 * @param sql
	 * @param beanParameters bean数据数组
	 * @throws Exception 
	 */
	public int[] executeBatchByArrayBeans(final String sql,Object... beanParameters)throws Exception;
	
	/**
	 * 批量执行insert，update，delete等操作<br>
	 * 例如insert into users (name,login_name,password) values(:name,:login_name,:password)<br>
	 * 参数用冒号,参数为Map的key名
	 * @param sql
	 * @param mapParameters map数据集合
	 * @throws Exception 
	 */
	public int[] executeBatchByCollectionMaps(final String sql,Collection<Map> mapParameters)throws Exception;
	
	/**
	 * 批量执行insert，update，delete等操作<br>
	 * 例如insert into users (name,login_name,password) values(:name,:login_name,:password)<br>
	 * 参数用冒号,参数为Map的key名
	 * @param sql
	 * @param mapParameters map数据数组
	 * @throws Exception 
	 */
	public int[] executeBatchByArrayMaps(final String sql,Map... mapParameters)throws Exception;
	
	/**
	 * insert时返回主键值
	 * @param tableName表名
	 * @param keyName自增字段名称
	 * @param beanParameters对象bean，例如userName属性对应user_name字段,不建议使用大写单词,如HTMLPath不可以，可以使用htmlPath
	 * @return 自增字段
	 * @throws Exception
	 */
	public String  insertBeanGetGeneratedKey(String tableName,Object beanParameters) throws Exception;
	
	/**
	 * insert时返回主键值
	 * @param tableName表名
	 * @param keyName自增字段名称
	 * @param mapParameters数据map，key对用字段，建议都小写.
	 * @return 自增字段
	 * @throws Exception
	 */
	public String insertMapGetGeneratedKey(String tableName,Map mapParameters) throws Exception;
	
	/**
	 * 通用用分页方法,page对象中返回结果为bean集合
	 * @param sql语句，不用写分页函数、排序，只需要写获取数据的内容，如：select * from tb_table where id=? and user_name like ?
	 * @param clazz返回对象类型
	 * @param arrayParameters参数集合
	 * @param page分页对象
	 * @return
	 */
	public Page findPageListBean(final String sql,Class clazz,Page page,Object... arrayParameters);

	/**
	 * 通用用分页方法,page对象中返回结果为bean集合
	 * @param sql语句，不用写分页函数、排序，只需要写获取数据的内容，如：select * from tb_table where id=:userId and user_name =:userName
	 * @param clazz返回对象类型
	 * @param page分页对象
	 * @param beanParameters参数bean
	 * @return
	 */
	public Page findPageListBeanByBean(final String sql,Class clazz,Page page,Object beanParameters);
	
	/**
	 * 通用用分页方法,page对象中返回结果为bean集合
	 * @param sql语句，不用写分页函数、排序，只需要写获取数据的内容，如：select * from tb_table where id=:user_id and user_name =:user_name
	 * @param clazz返回对象类型
	 * @param page分页对象
	 * @param mapParameters参数map
	 * @return
	 */
	public Page findPageListBeanByMap(final String sql,Class clazz,Page page,Map<String,Object> mapParameters);

	/**
	 * 通用用分页方法,page对象中返回结果为map集合
	 * @param sql语句，不用写分页函数、排序，只需要写获取数据的内容，如：select * from tb_table where id=? and user_name like ?
	 * @param arrayParameters参数集合
	 * @param page分页对象
	 * @return
	 */
	public Page findPageListMap(final String sql,Page page,Object... arrayParameters);
	
	/**
	 * 通用用分页方法,page对象中返回结果为map集合
	 * @param sql语句，不用写分页函数、排序，只需要写获取数据的内容，如：select * from tb_table where id=:user_id and user_name like :user_name
	 * @param page分页对象
	 * @param mapParameters参数map
	 * @return
	 */
	public Page findPageListMapByMap(final String sql,Page page,Map<String,Object> mapParameters);
}

/**
 * Copyright (c) 2009,天安怡和 All rights reserved.
 */